package com.gyhj.questionaires.config;

import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
import java.util.Objects;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 通用返回对象，所有http接口都必须返回此对象
 *
 * @param <T> 任意类型的值
 * @author MARK
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Response<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 响应代码
     */
    protected Integer code;

    /**
     * 响应消息
     */
    protected String msg;

    /**
     * 响应数据
     */
    protected T data;

    /**
     * 成功
     *
     * @param msg 消息
     * @param <T> 返回数据类型
     * @return DataResponse
     */
    public static <T> Response<T> success(String msg) {
        return new Response<>(200, msg, null);
    }


    /**
     * 成功
     *
     * @param data 消息
     * @param <T> 返回数据类型
     * @return DataResponse
     */
    public static <T> Response<T> data(T data) {
        return new Response<>(200, "成功", data);
    }

    /**
     * 成功
     *
     * @param msg 消息
     * @param data 数据
     * @param <T> 返回数据类型
     * @return DataResponse
     */
    public static <T> Response<T> success(String msg, T data) {
        return new Response<>(200, msg, data);
    }

    /**
     * 失败
     *
     * @return Response
     */
    public static <T> Response<T> failed() {
        CommonError error = CommonError.error();
        return new Response<>(error.getCode(), error.getMsg(), null);
    }

    /**
     * 失败
     *
     * @return Response
     */
    public static <T> Response<T> failed(String msg) {
        CommonError error = CommonError.error(msg);
        return new Response<>(error.getCode(), error.getMsg(), null);
    }

    /**
     * 失败
     *
     * @return Response
     */
    public static <T> Response<T> failed(String msg, T data) {
        CommonError error = CommonError.error(msg);
        return new Response<>(error.getCode(), error.getMsg(), data);
    }

    /**
     * 失败
     *
     * @return Response
     */
    public static <T> Response<T> failed(CommonError error) {
        return new Response<>(error.getCode(), error.getMsg(), null);
    }

    /**
     * @param code 代码
     * @param msg 消息
     * @param data 数据
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Response<T> response(int code, String msg, T data) {
        return new Response<>(code, msg, data);
    }


    /**
     * 判断响应结果是否成功
     *
     * @return 结果
     */
    public boolean isSuccess() {
        if (Objects.isNull(code)) {
            return false;
        }

        return Objects.equals(Integer.valueOf("200"), code);
    }

}
